
package com.kalvan.db.mybatis.etl;

import com.kalvan.db.mybatis.provider.EtlProvider;
import com.kalvan.db.mybatis.sharding.ShardingMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;

import java.util.List;
import java.util.Map;

/**
 * 抽数据封装数据方法<br>
 * 抽取数据时才使用该Mapper
 *
 * @author chenliang
 * @version 2018年11月25日
 */
public interface EtlMapper<T> extends ShardingMapper<T> {

    /**
     * 根据EtlUK字段获取数据
     *
     * @param params 参数
     */
    @SelectProvider(type = EtlProvider.class, method = "dynamicSQL")
    List<T> selectListByUk(Map<String, Object> params);

    /**
     * 根据时间段获取EtlUK
     *
     * @param syncStartTime 同步开始时间
     * @param syncEndTime   同步结束时间
     * @return 匹配的EtlUK 字段
     */
    @SelectProvider(type = EtlProvider.class, method = "dynamicSQL")
    List<Map<String, Object>> selectUkByRange(@Param("syncStartTime") String syncStartTime,
                                                 @Param("syncEndTime") String syncEndTime);
    /**
     * 查出记录条数
     *
     * @param tableName     表名
     * @param etlRange      范围条件字段名
     * @param syncStartTime 同步开始时间
     * @param syncEndTime   同步结束时间
     * @return 条数
     */
    @Select("select count(1) from ${tableName} where ${etlRange} between #{syncStartTime} and #{syncEndTime} ")
    long selectCountByRange(@Param("tableName") String tableName, @Param("etlRange") String etlRange,
                    @Param("syncStartTime") String syncStartTime, @Param("syncEndTime") String syncEndTime);

}
